﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Data;
using System.IO;

namespace AgendaManager.Service
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod (Description= "Hello World!!")]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public string Test(Caño caño, Contacto contacto, Obra obra, ObraCaño obraCaño, ObraContacto obraContacto, Pais pais, 
            Provincia provincia, Usuario usuario, FotoContacto fotoContacto, Empresa empresa, Carpeta carpeta, SubCarpeta subCarpeta, Semana semana,
            Foto foto, Plano plano, IvoNota ivoNota)
        {
            return "";
        }

        //[WebMethod]
        //public bool LogIn(string user, string password)
        //{
        //    return UsuarioHelper.LogIn(user, password);
        //}

        [WebMethod]
        public Usuario LogIn(string user, string password)
        {
            return UsuarioHelper.LogIn(user, password);
        }

        [WebMethod]
        public Caño NuevoCaño(Caño caño)
        {
            try
            {
                return CañoHelper.NuevoCaño(caño);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        //[WebMethod]
        //public DataTable RetrieveEntities(object dto, string filtro)
        //{
        //    try
        //    {
        //        return DAOBase.RetrieveEntities(dto, filtro);
        //    }
        //    catch (Exception)
        //    {
        //        throw;
        //    }
        //}

        [WebMethod]
        public object[] RetrieveEntities(object dto, string filtro)
        {
            try
            {
                switch (dto.GetType().Name)
                {
                    case "Caño":
                        return CañoDAO.RetrieveEntities(dto, filtro).ToArray();
                    case "Contacto":
                        return ContactoDAO.RetrieveEntities(dto, filtro).ToArray();
                    case "Obra":
                        return ObraDAO.RetrieveEntities(dto, filtro).ToArray();
                    case "Empresa":
                        return EmpresaDAO.RetrieveEntities(dto, filtro).ToArray();
                    case "Pais":
                        return PaisDAO.RetrieveEntities(dto, filtro).ToArray();
                    case "Contenido":
                        return ContenidoDAO.RetrieveEntities(dto, filtro).ToArray();
                    case "Provincia":
                        return ProvinciaDAO.RetrieveEntities(dto, filtro).ToArray();
                    case "InformeSemanal":
                        return InformeSemanalDAO.RetrieveEntities(dto, filtro).ToArray();
                    default:
                        return null;
                }
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool DeleteEntity(object dto)
        {
            try
            {
                switch (dto.GetType().Name)
                {
                    case "Semana":
                        return SemanaDAO.DeleteEntity(dto);
                    //case "IvoNota":
                    //    return IvoNotaDAO.DeleteEntity(dto);
                    //case "Caño" :
                        //return CañoDAO.DeleteEntity(dto);
                    //case "Contacto":
                        //return ContactoDAO.DeleteEntity(dto);
                    //case "ObraCaño":
                        //return ObraCañoDAO.DeleteEntity(dto);
                        
                    default:
                        return DAOBase.DeleteEntity(dto);
                }
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool UpdateUsuario(object dto)
        {
            try
            {
                return UsuarioDAO.Update(dto);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool UpdateCaño(object dto)
        {
            try
            {
                return CañoDAO.Update(dto);

            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool UpdateObra(object obraDto, object[] obraCañosDto)
        {
            try
            {
                if (!ObraDAO.Update(obraDto))
                    return false;

                if (obraCañosDto.GetLength(0) > 0)
                {
                    foreach (object obraCaño in obraCañosDto)
                    {
                        if (((ObraCaño)obraCaño).Id != 0)
                        {
                            if (!ObraCañoDAO.Update(obraCaño))
                                return false;
                        }
                        else
                        {
                            List<ObraCaño> o = new List<ObraCaño>();
                            o.Add((ObraCaño)obraCaño);
                            ObraCañoDAO.NuevasObrasCaños(o);
                            //((ObraContacto)obraContactoDto).
                        }
                    }
                }

                return true;
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool UpdateContacto(object contactoDto, object fotoContactoDto, object[] obraContactosDto)
        {
            try
            {
                if (!ContactoDAO.Update(contactoDto))
                    return false;

                if (((FotoContacto)fotoContactoDto).Foto != null)
                {
                    if (((FotoContacto)fotoContactoDto).Id != 0)
                    {
                        if (!ContactoDAO.Update(fotoContactoDto))
                            return false;
                    }
                    else
                    {
                        ((FotoContacto)fotoContactoDto).Id = ((Contacto)contactoDto).Id;
                        ContactoDAO.NuevaFoto((FotoContacto)fotoContactoDto);
                    }
                }

                if (obraContactosDto.GetLength(0) > 0)
                {
                    foreach (object obraContactoDto in obraContactosDto)
                    {
                        if (((ObraContacto)obraContactoDto).Id != 0)
                        {
                            if (!ContactoDAO.Update(obraContactoDto))
                                return false;
                        }
                        else
                        {
                            ObraContactoDAO.NuevoObraContacto((ObraContacto)obraContactoDto);
                            //((ObraContacto)obraContactoDto).
                        }

                        
                    }    
                }
                
                return true;

            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public Contacto NuevoContacto(Contacto contacto, FotoContacto fotoContacto, List<ObraContacto> obraContactos)
        {
            try
            {
                return ContactoDAO.NuevoContacto(contacto, fotoContacto, obraContactos);

            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        private void Log(Exception ex)
        {

            string mydocpath = "C:\\Log";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            sb.AppendLine("\r\nLog Entry : ");
            sb.AppendLine(string.Format("Error ocurrido a las: {0}", DateTime.Now));
            sb.AppendLine(string.Format("Mensaje del error: {0}", ex.Message));
            //sb.AppendLine(string.Format("Mensaje Inner del error: {0}", ex.InnerException.Message));
            sb.AppendLine(string.Format("StackTrace del error: {0}", ex.StackTrace));
            sb.AppendLine("------------------------------------------------");
            sb.AppendLine();
            sb.AppendLine();

            using (StreamWriter outfile = new StreamWriter(mydocpath + @"\Goc System Log.txt", true))
            {
                outfile.Write(sb.ToString());
            }
        }

        [WebMethod]
        public bool RecordarPassword(string email)
        {
            try
            {
                return UsuarioDAO.RecordarPassword(email);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        //[WebMethod]
        //public Obra NuevaObra(Obra obra)
        //{
        //    try
        //    {
        //        return ObraDAO.NuevaObra(obra);
        //    }
        //    catch (Exception)
        //    {

        //        throw;
        //    }
        //}

        [WebMethod]
        public bool NuevaObra(object obraDto, object[] obraCañosDto)
        {
            try
            {
                obraDto = ObraDAO.NuevaObra((Obra)obraDto);

                if (obraCañosDto.GetLength(0) > 0)
                {
                    foreach (object obraCaño in obraCañosDto)
                    {
                        ((ObraCaño)obraCaño).IdObra = ((Obra)obraDto).Id;
                        List<ObraCaño> o = new List<ObraCaño>();
                        o.Add((ObraCaño)obraCaño);
                        ObraCañoDAO.NuevasObrasCaños(o);
                    }
                }

                return true;
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public Empresa NuevaEmpresa(Empresa empresa)
        {
            try
            {
                return EmpresaDAO.NuevaEmpresa(empresa);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public Pais NuevoPais(Pais pais)
        {
            try
            {
                return PaisDAO.NuevoPais(pais);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public Provincia NuevaProvincia(Provincia provincia)
        {
            try
            {
                return ProvinciaDAO.NuevaProvincia(provincia);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public FotoContacto GetFotoContacto(int contactoId)
        {
            try
            {
                return ContactoDAO.GetFotoContacto(contactoId);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public InformeSemanal NuevoInformeSemanal(InformeSemanal informe)
        {
            try
            {
                return InformeSemanalDAO.NuevoInformeSemanal(informe);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public IvoNota NuevoContenido(IvoNota contenido)
        {
            try
            {
                return ContenidoDAO.NuevoContenido(contenido);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public SubCarpeta NuevaSubCarpeta(SubCarpeta subCarpeta)
        {
            try
            {
                return SubCarpetaDAO.NuevaSubCarpeta(subCarpeta);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool NuevoPlano(Plano plano)
        {
            try
            {
                return PlanoDAO.CreatePlano(plano);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool NuevaIvoNota(IvoNota ivoNota)
        {
            try
            {
                return IvoNotaDAO.CreateIvoNota(ivoNota);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }


        [WebMethod]
        public bool SetPlanos(List<Plano> planos)
        {
            try
            {
                return PlanoDAO.SetPlanos(planos);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public bool NuevosObrasCaños(List<ObraCaño> obrasCaños)
        {
            try
            {
                return ObraCañoDAO.NuevasObrasCaños(obrasCaños);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw ex;
            }
        }

        [WebMethod]
        public bool NuevaSemana(Semana semana)
        {
            try
            {
                return SemanaDAO.NuevaSemana(semana);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw ex;
            }
        }

        [WebMethod]
        public Foto NuevaFoto(Foto foto)
        {
            try
            {
                return FotoDAO.NuevaFoto(foto);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public Usuario NuevoUsuario(Usuario usuario)
        {
            try
            {
                return UsuarioDAO.NuevoUsuario(usuario);
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public object[] RetrieveEntitiesWhere(object dto, string where)
        {
            try
            {
                switch (dto.GetType().Name)
                {
                    //case "Caño":
                    //    return CañoDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    //case "Contacto":
                    //    return ContactoDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    //case "Obra":
                    //    return ObraDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "Empresa":
                        return EmpresaDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "Pais":
                        return PaisDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    //case "Contenido":
                    //    return ContenidoDAO.RetrieveEntities(dto, where).ToArray();
                    case "Provincia":
                        return ProvinciaDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    //case "InformeSemanal":
                    //    return InformeSemanalDAO.RetrieveEntities(dto, where).ToArray();
                    case "ObraCaño":
                        return ObraCañoDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "ObraContacto":
                        return ObraContactoDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "Carpeta":
                        return CarpetaDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "Semana":
                        return SemanaDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "SubCarpeta":
                        return SubCarpetaDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "Foto":
                        return FotoDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "Plano":
                        return PlanoDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    case "IvoNota":
                        return IvoNotaDAO.RetrieveEntitiesWhere(dto, where).ToArray();
                    default:
                        return null;
                }
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public object[] GetIvosNames(string where)
        {
            try
            {
                return IvoNotaDAO.GetIvosNames(where).ToArray();
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public object[] GetEntitiesPaginated(object dto, int num, string filtro)
        {
            try
            {
                switch (dto.GetType().Name)
                {
                    case "Foto":
                        return FotoDAO.GetEntitiesPaginated(dto, num, filtro).ToArray();
                    default:
                        return null;
                }
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }

        [WebMethod]
        public int GetMax(object dto)
        {
            return DAOBase.GetNextId(dto) - 1;
        }

        [WebMethod]
        public bool UpdateEntity(object dto)
        {
            try
            {
                switch (dto.GetType().Name)
                {
                    case "Semana":
                        return SemanaDAO.UpdateEntity(dto);
                    case "SubCarpeta":
                        return SubCarpetaDAO.UpdateEntity(dto);
                    default:
                        return false;
                }
            }
            catch (Exception ex)
            {
                Log(ex);
                throw;
            }
        }
    }
}